extern int main();
extern void SystemInit();
extern void __libc_init_array();
#define isr_nmi NMI_Handler
#define isr_hardfault HardFault_Handler
#define isr_svcall SVC_Handler
#define isr_pendsv PendSV_Handler
#define isr_systick SysTick_Handler
#define isr_irq0 TIMER_IRQ_0_Handler
#define isr_irq1 TIMER_IRQ_1_Handler
#define isr_irq2 TIMER_IRQ_2_Handler
#define isr_irq3 TIMER_IRQ_3_Handler
#define isr_irq4 PWM_IRQ_WRAP_Handler
#define isr_irq5 USBCTRL_IRQ_Handler
#define isr_irq6 XIP_IRQ_Handler
#define isr_irq7 PIO0_IRQ_0_Handler
#define isr_irq8 PIO0_IRQ_1_Handler
#define isr_irq9 PIO1_IRQ_0_Handler
#define isr_irq10 PIO1_IRQ_1_Handler
#define isr_irq11 DMA_IRQ_0_Handler
#define isr_irq12 DMA_IRQ_1_Handler
#define isr_irq13 IO_IRQ_BANK0_Handler
#define isr_irq14 IO_IRQ_QSPI_Handler
#define isr_irq15 SIO_IRQ_PROC0_Handler
#define isr_irq16 SIO_IRQ_PROC1_Handler
#define isr_irq17 CLOCKS_IRQ_Handler
#define isr_irq18 SPI0_IRQ_Handler
#define isr_irq19 SPI1_IRQ_Handler
#define isr_irq20 UART0_IRQ_Handler
#define isr_irq21 UART1_IRQ_Handler
#define isr_irq22 ADC_IRQ_FIFO_Handler
#define isr_irq23 I2C0_IRQ_Handler
#define isr_irq24 I2C1_IRQ_Handler
#define isr_irq25 RTC_IRQ_Handler

/*
naked 属性 告诉编译器 不生成 压栈汇编 push {r7, lr}等指令

ARM 状态与 Thumb 状态
有些处理器同时支持 ARM 和 Thumb 指令集,通过 BX 或 BLX 指令进行切换,当指令 BX
跳转地址的 LSB 位为 1,表示切换到 Thumb 状态,为 0 则切换到 ARM 状态。

无论是 ARM 还是
Thumb,其指令在存储器中都是边界对齐的（2字节或4字节对齐）,也就是地址的最低位总是
0。 因此,在执行跳转过程中,PC 寄存器中的最低位被舍弃,不起作用。 在 BX
指令的执行过程中,最低位正好被用作状态判断的标志,不会造成存储器访问不对齐的错误。

Cortex-M 系列处理器不支持 ARM 指令,因此也不存在 ARM
状态,所以反汇编中的函数地址最低位都是 1

bin 部分数据含义
0x8000000-0x8000003  ：中断向量表定义 栈顶指针,SRAM最大地址  送  SP
0x8000004-0x8000008  : 存储 reset中断函数地址（_start_func） 送  PC
 */

// reset handle

__attribute__((naked)) void _start_func()
{
	extern unsigned int _sidata, __data_start__, __data_end__, __bss_start__, __bss_end__;

	unsigned int *sdata;		// 0x20000000
	unsigned int *data_atflash; // 0x80000xx

	// copy data from flash to sram
	sdata = &__data_start__; // 0x20000000
	data_atflash = &_sidata; // 0x80000xx	
	while (sdata < &__data_end__)
	{
		*sdata++ = *data_atflash++;
	}

	/*clear bss*/
	sdata = &__bss_start__;
	while (sdata < &__bss_end__)
	{
		*sdata++ = 0;
	}

	//  __libc_init_array();
	// SystemInit();
	main();
}

/***********************中断向量声明******************************* */
//  声明 中断函数 防止编译器报错
#ifndef __WEAK
#define __WEAK __attribute__((weak))
#endif

__WEAK void NMI_Handler() {};
__WEAK void HardFault_Handler() {};
__WEAK void SVC_Handler() {};
__WEAK void PendSV_Handler() {};
__WEAK void SysTick_Handler() {};
__WEAK void TIMER_IRQ_0_Handler() {};
__WEAK void TIMER_IRQ_1_Handler() {};
__WEAK void TIMER_IRQ_2_Handler() {};
__WEAK void TIMER_IRQ_3_Handler() {};
__WEAK void PWM_IRQ_WRAP_Handler() {};
__WEAK void USBCTRL_IRQ_Handler() {};
__WEAK void XIP_IRQ_Handler() {};
__WEAK void PIO0_IRQ_0_Handler() {};
__WEAK void PIO0_IRQ_1_Handler() {};
__WEAK void PIO1_IRQ_0_Handler() {};
__WEAK void PIO1_IRQ_1_Handler() {};
__WEAK void DMA_IRQ_0_Handler() {};
__WEAK void DMA_IRQ_1_Handler() {};
__WEAK void IO_IRQ_BANK0_Handler() {};
__WEAK void IO_IRQ_QSPI_Handler() {};
__WEAK void SIO_IRQ_PROC0_Handler() {};
__WEAK void SIO_IRQ_PROC1_Handler() {};
__WEAK void CLOCKS_IRQ_Handler() {};
__WEAK void SPI0_IRQ_Handler() {};
__WEAK void SPI1_IRQ_Handler() {};
__WEAK void UART0_IRQ_Handler() {};
__WEAK void UART1_IRQ_Handler() {};
__WEAK void ADC_IRQ_FIFO_Handler() {};
__WEAK void I2C0_IRQ_Handler() {};
__WEAK void I2C1_IRQ_Handler() {};
__WEAK void RTC_IRQ_Handler() {};

/*中断向量表 占用data 区*/
extern unsigned int __StackTop;
__attribute__((section(".vectors"))) const void *__vectors[] = {
	(void *)(&__StackTop), /*ram最大地址*/
	/*reset_handler 单片机复位后从这个地址开始运行 */
	/*cortex M只支持thumb2 指令,机器码最低位强制是1,所以地址会+1 */
	_start_func,
	isr_nmi,
	isr_hardfault,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	isr_svcall,
	0,
	0,
	isr_pendsv,
	isr_systick,
	isr_irq0,
	isr_irq1,
	isr_irq2,
	isr_irq3,
	isr_irq4,
	isr_irq5,
	isr_irq6,
	isr_irq7,
	isr_irq8,
	isr_irq9,
	isr_irq10,
	isr_irq11,
	isr_irq12,
	isr_irq13,
	isr_irq14,
	isr_irq15,
	isr_irq16,
	isr_irq17,
	isr_irq18,
	isr_irq19,
	isr_irq20,
	isr_irq21,
	isr_irq22,
	isr_irq23,
	isr_irq24,
	isr_irq25};
